package app.redis;

import app.htby.utils.RedisUtils;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 大数据 redis 连接池 工具类
 * @author lfy.xys
 * @date 2018年6月5日
 *
 */
public class JedisDataPlusPool {
	private static JedisPool pool = null;

	/**
	 * 建立连接池 真实环境，一般把配置参数缺抽取出来。
	 * 
	 */
	private static void createJedisPool() {
		// 建立连接池配置参数
		JedisPoolConfig config = new JedisPoolConfig();
		// 设置最大连接数 ，如果赋值为-1，则表示不限制；如果pool已经分配了maxActive个jedis实例，则此时pool的状态为exhausted(耗尽)
		config.setMaxTotal(10);
		// 控制一个pool最多有多少个状态为idle(空闲的)的jedis实例
		config.setMaxIdle(3);
		// 设置最大阻塞时间， 小于零:阻塞不确定的时间, 默认-1
		config.setMaxWaitMillis(1000);
		// 在borrow(引入)一个jedis实例时，是否提前进行validate操作；如果为true，则得到的jedis实例均是可用的；
		config.setTestOnBorrow(true);
		// return 一个jedis实例给pool时，是否检查连接可用性（ping()）
		config.setTestOnReturn(true);
		// 创建连接池
		pool = new JedisPool(config, RedisUtils.dataPlusIp, RedisUtils.dataPlusPort);
	}

	/**
	 * 在多线程环境同步初始化
	 */
	private static synchronized void poolInit() {
		if (pool == null)
			createJedisPool();
	}

	/**
	 * 获取一个jedis 对象
	 * 
	 * @return
	 */
	public static Jedis getJedis() {
		if (pool == null)
			poolInit();
		return pool.getResource();
	}

	/**
	 * 归还一个连接
	 * 
	 * @param jedis
	 */
	public static void returnRes(Jedis jedis) {
		if (jedis != null) {
			jedis.close();
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		
		Jedis jedis3 = JedisDataPlusPool.getJedis();
		System.out.println(jedis3.isConnected());
		
	}

}
